package com.gokzzz.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.gokzzz.dto.SysRoleSaveOrUpdateDTO;
import com.gokzzz.dto.SysRoleSearchQueryDTO;
import com.gokzzz.dto.SysRoleUserSearchQueryDTO;
import com.gokzzz.entity.SysRole;
import com.gokzzz.response.PageData;
import com.gokzzz.vo.SysRoleVO;
import com.gokzzz.vo.SysUserVO;
import org.springframework.validation.annotation.Validated;

import javax.validation.constraints.Min;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.util.List;
import java.util.Set;

/**
 * @author gokzzz
 * @date 2022-04-02 15:26
 */

@Validated
public interface ISysRoleService extends IService<SysRole> {
    /**
     * 获取分页条件查询
     *
     * @param sysRoleSearchQueryDTO 条件
     * @param page                  页码
     * @param size                  页数
     * @return PageData<SysRoleVO>
     */
    PageData<SysRoleVO> listSysRole(
            @NotNull(message = "角色搜索条件对象不能为空") SysRoleSearchQueryDTO sysRoleSearchQueryDTO,
            @Min(value = 1, message = "页码必须大于0") @NotNull(message = "页码为空") Long page,
            @Min(value = 1, message = "页树必须大于0") @NotNull(message = "页数为空") Long size);

    /**
     * 添加系统角色
     *
     * @param sysRoleSaveOrUpdateDTO 系统角色DTO
     */
    void saveSysRole(
            @Validated({SysRoleSaveOrUpdateDTO.Save.class}) SysRoleSaveOrUpdateDTO sysRoleSaveOrUpdateDTO);

    /**
     * 修改系统角色
     *
     * @param sysRoleSaveOrUpdateDTO 系统角色DTO
     */
    void updateSysRole(
            @Validated({SysRoleSaveOrUpdateDTO.Update.class}) SysRoleSaveOrUpdateDTO sysRoleSaveOrUpdateDTO);

    /**
     * 删除系统角色
     *
     * @param id 系统角色id
     */
    void delSysUser(@NotEmpty(message = "系统角色ID集合不能为空") Set<Long> id);

    /**
     * 获取授权用户信息
     *
     * @param sysRoleUserSearchQueryDTO 查询条件
     * @param id                        系统角色id
     * @param page                      页码
     * @param size                      页数
     * @return PageData<SysUserVO>
     */
    PageData<SysUserVO> listAuthSysUserByRoleIdAndPageQuery(
            @NotNull(message = "角色搜索条件对象不能为空") SysRoleUserSearchQueryDTO sysRoleUserSearchQueryDTO,
            @Min(value = 1, message = "系统角色ID必须大于0") @NotNull(message = "系统角色ID不能为空") Long id,
            @Min(value = 1, message = "页码必须大于0") @NotNull(message = "页码不能为空") Long page,
            @Min(value = 1, message = "页数必须大于0") @NotNull(message = "页数不能为空") Long size);

    /**
     * 获取未授权用户信息
     *
     * @param sysRoleUserSearchQueryDTO 查询条件
     * @param id                        系统角色id
     * @param page                      页码
     * @param size                      页数
     * @return PageData<SysUserVO>
     */
    PageData<SysUserVO> listUnAuthSysUserByRoleIdAndPageQuery(
            @NotNull(message = "角色搜索条件对象不能为空") SysRoleUserSearchQueryDTO sysRoleUserSearchQueryDTO,
            @Min(value = 1, message = "系统角色ID必须大于0") @NotNull(message = "系统角色ID不能为空") Long id,
            @Min(value = 1, message = "页码必须大于0") @NotNull(message = "页码不能为空") Long page,
            @Min(value = 1, message = "页数必须大于0") @NotNull(message = "页数不能为空") Long size);

    /**
     * 授权用户
     *
     * @param userIds 用户id集合
     * @param roleId  系统角色id
     */
    void authSysUser(
            @NotEmpty(message = "用户id集合不能为空") Set<Long> userIds,
            @Min(value = 1, message = "系统角色ID必须大于0") @NotNull(message = "系统角色ID不能为空") Long roleId);

    /**
     * 取消授权用户
     *
     * @param userIds 用户id集合
     * @param roleId  系统角色id
     */
    void unAuthSysUser(
            @NotEmpty(message = "用户id集合不能为空") Set<Long> userIds,
            @Min(value = 1, message = "系统角色ID必须大于0") @NotNull(message = "系统角色ID不能为空") Long roleId);

    /**
     * 获取系统角色列表
     *
     * @return List<SysRole>
     */
    List<SysRoleVO> getSysRole();

    /**
     * 根据角色ID获取系统菜单id
     *
     * @param id 系统角色id
     * @return Set<Long>
     */
    List<Long> getSysMenu(
            @Min(value = 1, message = "系统角色ID必须大于0") @NotNull(message = "系统角色ID不能为空") Long id);

    /**
     * 根据角色ID添加系统菜单id
     *
     * @param id      系统角色id
     * @param menuIds 系统菜单id集合
     */
    void saveSysMenu(
            @Min(value = 1, message = "系统角色ID必须大于0") @NotNull(message = "系统角色ID不能为空") Long id,
            @NotEmpty(message = "系统菜单id集合不能为空") Set<Long> menuIds);
}
